﻿//#include <iostream>
//using namespace std;
//
//class Date
//{
//public:
//	Date(int year = 1900, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	Date(const Date& d)
//	{
//		cout << "Date(const Date& d)" << endl;
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//
//	// 传值返回
//	// d1 = d4 赋值重载
//	// d1 = d2 = d4;
//	 //Date operator=(const Date& d) // void 返回 或者 Date 返回
//	 //{
//		//_year = d._year;
//		//_month = d._month;
//		//_day = d._day;
//
//		//return *this;
//	 //} 
//
//	 Date &operator=(const Date& d) //传引用返回 和 传值返回结果不同
//	{
//		if (this != &d)
//		{
//			_year = d._year;
//			_month = d._month;
//			_day = d._day;
//		}
//
//		return *this;
//	}
//
//	 void Print()
//	 {
//		 cout << _year << "-" << _month << "-" << _day << endl;
//	 }
//
//	 ~Date()
//	 {
//		 cout << "~Date()" << endl;
//		 _year = -1;
//		 _month = -1;
//		 _day = -1;
//	 }
//
//private:
//	   int _year;
//	   int _month;
//	   int _day;
//};
//
//
//int main()
//{
//	Date d1(2024, 4, 14);
//
//	// 拷贝构造
//	Date d2(d1);
//	Date d3 = d1; // 此时调用的是拷贝构造，拷贝构造 是把一个已经存在的对象，拷贝初始化另一个要创建初始化的对象
//	 
//	// 赋值重载
//	Date d4(2024, 5, 1);
//	d1 = d4; //此时不是拷贝构造了 此时调用的是赋值重载（赋值拷贝)，是把一个已经存在的对象，拷贝赋值给是把另一个已经存在的对象
//
//	Date d5;
//	d5 = d1;
//
//    d1 = d2 = d4; //void 不支持 ，改成 Date 返回就行
//
//	return 0;
//}
//
//
//// —————————————— 传值返回和引用返回S
//
//Date func1() { //传值返回，会拷贝一个临时对象，返回这个临时对象
//	//Date d;
//	Date d(2024, 4, 12); 
//	return d; //拷贝的是临时对象 析构的是d
//}
//
//Date& func2() //引用返回，不生成拷贝
//{
//	//Date d;
//	Date d(2024, 4, 12);
//	cout << &d << endl;
//	return d;// 返回d的别名，返回局部变量或临时变量的地址: d
//}
//
//Date& func3() { 
//	static Date d(2024, 4, 12);
//	return d; //拷贝的是临时对象 析构的是d
//}
//
// //出了函数作用，返回对象还在，才能引用返回，减少拷贝
// //a、返回对象生命周期到了，会析构，传值返回
// //b、返回对象生命周期没到了，不会析构，传引用返回
//
//int fx()
//{
//	int a = 1;
//	int b = 2;
//	return a + b;
//}
//
////int main()
////{
////	//func1(); 
////	//func2();
////	
////	//Date ref1 = func1();
////	//ref1.Print();
////
////	//Date&ref2 = func2(); //这个打印不行，因为权限放大了
////	//ref2.Print(); //但是改成const了之后 打印函数调用不了
////
////	//const Date& ref = func2(); //改成权限就不会出现放大情况
////	//cout << &ref << endl;  //打印结果 ref 和 d 地址相同，易知在引用返回中 ref 是 d 的别名 
////
////	//fx(); //再次调用 就会覆盖 func1()函数
////	////总结：返回对象是一个局部对象或者临时对象，出了当前函数作用域，就析构销毁了，那么就不能引用返回，
////	////用引用返回是存在风险的，因为引用对象在func函数栈帧已经销毁了
////	////虽然引用返回可以减少一次拷贝，但是出了函数作用，返回对象还在，才能引用返回
////
////	Date ref3 = func3();
////	ref3.Print();
////
////	return 0;
////}
//
//
//
//
////#include <iostream>
////using namespace std;
//////———————————————— 赋值运算符只能重载成类的成员函数不能重载成全局函数
////
////class Date
////{
////public:
////	Date(int year = 1900, int month = 1, int day = 1)
////	{
////		_year = year;
////		_month = month;
////		_day = day;
////	}
////	int _year;
////	int _month;
////	int _day;
////};
////// 赋值运算符重载成全局函数，注意重载成全局函数时没有this指针了，需要给两个参数
////Date& operator=(Date& left, const Date& right)
////{
////	if (&left != &right)
////	{
////		left._year = right._year;
////		left._month = right._month;
////		left._day = right._day;
////	}
////	return left;
////}
////// 编译失败：
////// error C2801: “operator =”必须是成员函数
//
//
